package com.zpark.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @PackageName: com.zpark.jdk
 * @ClassName: JdkProxy1
 * @Description:
 * @author: RZS
 * @date: 2023/3/30  8:51
 */
public class JdkProxy1 implements InvocationHandler {
    // 定义代理目标对象
    private Object target;
    // 创建切面类对象
    private MyAspect aspect = new MyAspect();


    /**
     *      处理代理实例上的方法调用并返回结果
     * @param proxy 调用方法的代理实例
     * @param method Method实例对应于代理实例上调用的接口方法
     * @param args 参数
     * @return 从代理实例上的方法调用返回的值
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        aspect.myBefore();
        // 执行代理对象的方法
        Object invoke = method.invoke(target, args);
        aspect.myAfter();
        return invoke;
    }

    /**
     * 获取目标代理对象
     * @param targetObj 被代理对象
     * @return
     */
    private Object getTarget(Object targetObj){
        // 给目标对象赋值
        this.target = targetObj;

        return Proxy.newProxyInstance(
                targetObj.getClass().getClassLoader(),
                targetObj.getClass().getInterfaces(),
                this
        );
    }

    public static void main(String[] args) {
        JdkProxy1 proxy1 = new JdkProxy1();
        // 获取代理目标对象
        IUserMapper userMapper = (IUserMapper) proxy1.getTarget(new UserMapperImpl());
        userMapper.addUser("大锤", "123456");
    }
}
